package com.filldream.fastboot.common.stockUtils.cf;

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.filldream.fastboot.common.stockUtils.qt.entity.StockInfo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 东财接口
 * @version 2.0
 */
public class CfUtil {

    /**
     * 东方财富获取股票基本信息，即自选股列表的基本信息
     * @param cfCodes   逗号隔开的东方财富的代码
     * @return  返回东财接口返回值
     */
    public static JSONObject getStock(String cfCodes){
        String url = "https://push2.eastmoney.com/api/qt/ulist.np/get";
        Map<String,Object> paramMap = new HashMap<>();
        paramMap.put("cb", "jQuery35109640477738441828_1752735891014");
        paramMap.put("ut", "6d2ffaa6a585d612eda28417681d58fb");
        paramMap.put("fields", "f1,f2,f3,f4,f5,f6,f8,f9,f12,f13,f14,f19,f29,f62,f66,f72,f78,f84,f139,f152");
        paramMap.put("dect", "1");
        paramMap.put("invt", "2");
        paramMap.put("_", "1752735891029");
        paramMap.put("secids", cfCodes);
        String jsonResult = HttpUtil.get(url, paramMap);
        jsonResult = jsonResult.replaceAll("jQuery35109640477738441828_1752735891014\\(", "");
        jsonResult = jsonResult.substring(0, jsonResult.length()-2);
        return JSONObject.parseObject(jsonResult);
    }

    /**
     * 东方财富获取股票基本信息，即自选股列表的基本信息
     * @param cfCodes   逗号隔开的东方财富的代码
     * @return  返回List<StockInfo>
     */
    public static List<StockInfo> getStockList(String cfCodes){
        JSONObject stock = getStock(cfCodes);
        List<StockInfo> stockInfoList = toStockInfoList(stock);
        stockInfoList.forEach( item -> {
            item.setName( item.getName().equals("A50期指当月连续") ? "A50连续" : item.getName() );
            item.setName( item.getName().equals("美元兑离岸人民币") ? "离岸人民币" : item.getName() );
            item.setName( item.getName().equals("黄金/美元") ? "现货黄金" : item.getName() );
            item.setName( item.getName().equals("美国10年期国债收益率") ? "美十年债收益" : item.getName() );
            item.setName( item.getName().equals("中国30年期国债") ? "中30年债收益" : item.getName() );
            item.setName( item.getName().equals("纳斯达克中国金龙指数") ? "纳指中国金龙" : item.getName() );
            item.setName( item.getName().equals("布伦特原油当月连续") ? "布伦特原油" : item.getName() );
            item.setName( item.getName().equals("恒生科技指数期货主力") ? "恒科期货主力" : item.getName() );
        });
        return stockInfoList;
    }

    /**
     * 将东财的数据转换成StockInfo
     * @param cfStock
     * @return
     */
    private static List<StockInfo> toStockInfoList(JSONObject cfStock){
        List<StockInfo> result = new ArrayList<>();
        JSONArray list = cfStock.getJSONObject("data").getJSONArray("diff");
        list.forEach( i -> {
            JSONObject item = (JSONObject) i;
            Integer f1 = item.getInteger("f1");
            BigDecimal d = new BigDecimal( "10").pow(f1);
            StockInfo stockInfo = new StockInfo();
            stockInfo.setName(item.getString("f14"));
            try{
                stockInfo.setNowPrice(item.getBigDecimal("f2").divide(d,f1,BigDecimal.ROUND_DOWN));
            }catch (Exception e){
                stockInfo.setNowPrice(null);
            }
            try{
                stockInfo.setZde(item.getBigDecimal("f4").divide(d,f1,BigDecimal.ROUND_DOWN));
            }catch (Exception e){
                stockInfo.setZde(null);
            }
            try{
                stockInfo.setZf(item.getBigDecimal("f3").divide(new BigDecimal( "100"),2,BigDecimal.ROUND_DOWN));
            }catch (Exception e){
                stockInfo.setZf(null);
            }
            stockInfo.setSearchCode( item.getString("f13") + "." + item.getString("f12") );
            result.add(stockInfo);
        });
        return result;
    }


}
